package com.run2code.design.behavioral.template;

/**
 * 抽象的退款流程
 * 关注公众号【奔跑的码畜】，一起进步不迷路
 *
 * @author 第七人格
 * @date 2023/12/28
 */
public abstract class AbstractRefund {
    /**
     * 退款流程
     */
    protected final void doRefund() {
        // 步骤一：申请
        this.apply();
        // 是否需要审核
        if (needVerify()) {
            // 步骤二：审核
            this.verify();
        }
        // 步骤三：退款
        this.refundMoney();
    }

    /**
     * 申请 - 延迟到子类实现
     */
    abstract void apply();

    /**
     * 公共的审核方法
     */
    final void verify() {
        System.out.println("触发公共的审核逻辑");
    }

    /**
     * 公共的退款方法
     */
    final void refundMoney() {
        System.out.println("触发公共的退款逻辑");
    }

    /**
     * 钩子方法 - 是否需要审核
     *
     * @return boolean
     */
    protected boolean needVerify() {
        return true;
    }
}